Unity Shader Graph 漫游解析 (五) 阴影、多Pass

您所在的位置:网站首页 unity shader 阴影 Unity Shader Graph 漫游解析 (五) 阴影、多Pass

Unity Shader Graph 漫游解析 (五) 阴影、多Pass

2023-04-23 03:26| 来源: 网络整理| 查看: 265

五、阴影投射阴影

投射阴影需要有 ShadowCaster Pass,来生成 ShadowMap,并且为了避免自阴影尖刺,在生成 Shadow Map 时需要对 物体顶点做偏移

并且这里对于不同的平台,我们还需要做 RESVERSE_Z 判断

光源通过这个Pass 得到 物体在光源投影空间的深度值,并输出到 Shadow Map, 片元着色器的输出并没有被使用。该 Pass 的片元输出也不会写入帧缓冲,所以这个 Blend 删掉也可以,ShaderGraph 生成的 Shader 是带有的。

效果:

接收阴影

要接收阴影就需要计算 shadowCoord,即 Shadow Map 的 UV

Shadow Map 是在屏幕空间的, 如果只有一个级联,那么直接生成齐次坐标即可,但是如果是多个级联,则屏幕被分成多个部分,且每个级联的光源远近不同(Shadow Map 的精度不同) 即 光源投影空间转换矩阵也不同。这也意味着阴影投射的 DrawCall数为 投影光源数 级联数 投影物体数

所以还需要计算 级联下标。

这里直接使用 TransformWorldToShadowCoord API:

效果:

可以看到,立方体接收了球的阴影

另外这里 shadowCoord 是在顶点计算的,如果级联数为 4 的话,那么会有 Bug,此时要在片元里面计算 shadowCoord:

关于阴影投射时的顶点片元,可以在管线设置中设置偏移量:

也可以给某些灯光单独设置偏移:

附加光源阴影

URP 中只有 方向光 和 聚光灯 是参与实时 Shadow Map 计算的,对于点光源 则需要设置为 烘焙光,烘焙 离线的 Shadow Map

附加光源的阴影衰减在 GetAdditionalLight 时就已经计算了(同样是采样 Shadow Map 计算光源投影空间深度 然后比较)。

所以直接把附加阴影结果乘上阴影衰减即可:

在 管线设置中 可以关闭 附加光源的阴影投射,这也 URP 会通过宏定义 在编译时去掉附加光源阴影计算部分

自定义阴影颜色

会发现,物体在自己身上也会有阴影,这个问题在默认管线中也有,如果把 偏移设置的非常大,则这部分自阴影会消失,但是产生的阴影也会有较大的偏差。

所以要自定义阴影颜色可以使用 Projector 组件,不过 URP 是不支持 Projector 组件的。

六、多 Pass

在 URP 刚出来时,想要进行多 Pass 渲染,需要通过 RenderFeature 来进行,较为复杂。

在 新的 URP 中,多 Pass 仍然通过 RenderFeature 来进行,但是对一块做了优化,现在多 Pass 非常简单。

以描边 和 透视 Pass 为例,我们现在 Shader 中写出这两个 Pass,注意!一定要给 Pass 赋予自定义的 LightMode:

描边 Pass:

透视 Pass:

之后,我们找到 管线设置,其引用了一个 ForwardRender:

找到 这个 ForwardRender:

其下面有一个 Add Renderer Feature 按钮,点击 只能添加一种 RenderFeature。 Render Feature 我们可以自定义其它种类 来实现各种 后处理 或 多Pass 效果,但对于一般的 多Pas,我们用默认的即可,

Event 表示该 Render Feature 作用的时机,可以用做 后处理阶段,也可以在 透明物体渲染前应用 等等,这里就在 不透明物体渲染之后调用吧(因为我们需要 不透明物体写入的深度)

Layer Mask 表示那个 Layer 下的物体会受其作用,我们将其设置为 Everything

LightMode Tags 就是用来指定我们的 多Pass的,前面我们定义 Pass 的时候 已经定义了 LightMode 名字,这里直接给上即可:

调整材质的属性:

场景中使用该材质的物体,就应用了 这两个 Pass:



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3